#define _CRT_SECURE_NO_WARNINGS 1


//#include<queue>
//#include<iostream>
//
//using namespace std;
//
//int main()
//{
//	queue<int> q;
//	q.push(1);
//	q.push(2);
//	q.push(3);
//	q.push(4);
//	while (!q.empty())
//	{
//		cout << q.front() << ' ';
//		q.pop();
//	}
//	cout << endl;
//
//	return 0;
//}


//#include<set>
//#include<queue>
//#include<iostream>
//
//using namespace std;
//
//class TreeNode
//{
//public:
//	int val;
//	TreeNode* left, * right;
//	TreeNode(int val)
//	{
//		this->val = val;
//		this->left = this->right = NULL;
//	}
//};
//
//queue<TreeNode*> q;
//
//void NodePush(TreeNode* root)
//{
//
//}
//
//int main()
//{
//
//
//	return 0;
//}


//#include<iostream>
//
//using namespace std;
//
//struct ListNode 
//{
//    int val;
//    ListNode* next;
//    ListNode(int x) : val(x), next(NULL) {}
//};
//
//bool hasCycle(ListNode* head)
//{
//    if (head == nullptr)
//    {
//        return false;
//    }
//    else if (head->next == nullptr)
//    {
//        return true;
//    }
//
//    ListNode* fast, * slow = head;
//
//    while (fast && fast->next)
//    {
//        slow = slow->next;
//        fast = fast->next->next;
//        if (fast == slow)
//        {
//            return true;
//        }
//    }
//
//    return false;
//}
//
//int main()
//{
//
//
//	return 0;
//}


#include<vector>
#include<iostream>

using namespace std;

int tribonacci(int n)
{
    vector<int> v(n + 1, 0);

    if (n == 0)
    {
        return 0;
    }
    else if (n == 1 || n == 2)
    {
        return 1;
    }

    v[1] = v[2] = 1;

    for (int i = 3; i <= n; i++)
    {
        v[i] = v[i - 3] + v[i - 2] + v[i - 1];
    }

    return v[n];
}

int main()
{
    cout << tribonacci(0) << endl;

	return 0;
}